package com;

import io.netty.util.Recycler;

public class RecyclerDemo2 {

	// 首先定义了一个Recycler的成员变量RECYCLER, 在匿名内部类中重写了newObject方法, 也就是创建对象的方法, 该方法就是用户自定义的
	// 这里newObject返回的new User(handle), 代表当回收站没有此类对象的时候, 可以通过这种方式创建对象
	// 成员变量RECYCLER, 可以用来对此类对象的回收和再利用
	private static final Recycler<User> RECYCLER = new Recycler<User>() {
        @Override
        protected User newObject(Handle<User> handle) {
            return new User(handle);
        }
    };

    static class User{
    	// 定一个了一个静态内部类User, User中有个成员变量handle, 在构造方法中为其赋值, handle的作用, 就是用于对象回收的
        private final Recycler.Handle<User> handle;
        public User(Recycler.Handle<User> handle){
            this.handle=handle;
        }
        // 并且定义了一个方法recycle, 方法体中通过handle.recycle(this)这种方式将自身对象进行回收, 通过这步操作, 就可以将对象回收到Recycler中
        public void recycle(){
            handle.recycle(this);
        }
    }

    // 在main方法中, 通过RECYCLER的get方法获取一个user, 然后进行回收
    // 再通过get方法将回收站的对象取出, 再次进行回收, 最后判断两次取出的对象是否为一个对象, 最后结果输出为true
    // 以上demo就可以说明Recycler的回收再利用的功能
    public static void main(String[] args) throws InterruptedException{
        User user1 = RECYCLER.get();
        // 异线程测试
        Thread t = new Thread(() -> {
        	user1.recycle();
        	User user3 = RECYCLER.get();
        	System.out.println("thread: " + (user1 == user3)); // 输出为false，说明异线程只是帮忙回收，但这个回收的对象不是自己线程的，不能被自己重复利用
        });
        t.start();
        Thread.sleep(200);
        User user2 = RECYCLER.get();
        user2.recycle();
        System.out.println("main: " + (user1 == user2));
    }

}
